package com.j.lemon.learn.thread.interrapt;

import java.util.HashMap;
import java.util.Map;

/**
 * 线程中断，可以使用Thread.stop()方法，但是该方法会强制中断当前线程的操作，如果当前在写数据时只写了一部分，那么就会破坏数据。
 * JDK目前也废弃了stop方法，建议使用Thread.interrupt()方法来中断线程，该方法执行之后，会告诉当前线程你要被终止了，当前线程不会立即终止，会继续执行当前的任务，
 * 执行完成之后，使用Thread.isinterrupt()来判断当前线程是否被告知要求终止，如果true，则通过代码停止当前线程。
 *
 * 另，如果线程在sleep的时候，收到了中断通知，那么sleep会抛出异常，同时清除中断状态。所以在catch里，要再进行interrupt操作。
 *
 * Thread.interrupted() ：判断当前线程是否被中断，并清除中断状态
 * isInterrupt(): 判断此线程是否被中断，不清除中断状态
 * interrupt() : 中断此线程
 */
public class InterruptThread implements Runnable {


    public static void main(String[] args) throws InterruptedException {
        Map<String,Thread> map = new HashMap<>();
        InterruptThread in = new InterruptThread();
        for (int i = 0; i < 2100; i++) {
            Thread thread = new Thread(in);
            thread.start();
        }
        System.out.println("第一批创建完成，等待11秒");
        Thread.sleep(11000L);
        System.out.println("等待结束");
        for (int i = 0; i < 2100; i++) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("线程:"+Thread.currentThread().getId());
                }
            });
            thread.start();
        }
//        for (int i = 0; i < 10; i++) {
//            Thread thread = new Thread(in);
//            thread.start();
//        }

    }



    @Override
    public void run() {
        Thread thread = Thread.currentThread();
        try {
            Thread.sleep(10000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("线程:"+Thread.currentThread().getId());
        int num = 0;
//        while(true){
//            if(thread.isInterrupted()){
//                System.out.println("线程收到停止通知");
//                System.out.println(num);
//                break;
//            }else{
//                num++;
//            }
//        }
    }
}
